package net.model;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.NumberFormat;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "RASGO_OBJETO")
public class RasgoObjeto implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6311009270578342847L;

	static NumberFormat numbertFormat = new DecimalFormat();

	@Id
	@Column(name = "uid")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Long id;

	/**
	 * Objeto al que pertenece
	 */
	@ManyToOne
	@JoinColumn(name = "ID_OBJETO", insertable = false, updatable = false, nullable = false)
	private Objeto objeto;
	
	@ManyToOne
	@JoinColumn(name = "ID_RASGO", nullable = false)
	private Rasgo rasgo;
	
	@Column(name = "valor")
	private Double valor;

	@ManyToOne
	@JoinColumn(name = "ID_CLASE")
	private Clase clase;

	@Column(name = "indice")
	private Integer indice;
	
	public RasgoObjeto() {
		super();
	}

	public RasgoObjeto(Rasgo rasgo, Double valor) {
		super();
		this.rasgo = rasgo;
		this.valor = valor;
	}

	public RasgoObjeto(Rasgo rasgo, Double valor, Clase clase) {
		super();
		this.rasgo = rasgo;
		this.valor = valor;
		this.clase = clase;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Double getValor() {
		return valor;
	}

	public void setValor(Double valor) {
		this.valor = valor;
	}

	public Objeto getObjeto() {
		return objeto;
	}

	public void setObjeto(Objeto objeto) {
		this.objeto = objeto;
	}

	public Rasgo getRasgo() {
		return rasgo;
	}

	public void setRasgo(Rasgo rasgo) {
		this.rasgo = rasgo;
	}

	public Clase getClase() {
		return clase;
	}

	public void setClase(Clase clase) {
		this.clase = clase;
	}

	public Integer getIndice() {
		return indice;
	}

	public void setIndice(Integer indice) {
		this.indice = indice;
	}

	public boolean equals(Object obj) {
		if (obj == null)
			return false;
		if (!(obj instanceof RasgoObjeto))
			return false;
		RasgoObjeto r = (RasgoObjeto) obj;

		if (this.getRasgo() != null && this.getClase() == null
				&& r.getRasgo() != null && r.getClase() == null)
			return this.getRasgo().equals(r.getRasgo());
		if (this.getRasgo() != null && this.getClase() != null
				&& r.getRasgo() != null && r.getClase() != null)
			return this.getRasgo().equals(r.getRasgo())
					&& this.getClase().equals(r.getClase());
		return false;
	}

	/**
	 * Retorna el valor para calcular el valor promedio del rasgo en la clase.
	 * Para la mayoria de los rasgos sera el valor del rasgo del objeto.
	 */
	public Double getValorRasgoClase() {
		return getValor();
	}

	public String toString() {
		if (getRasgo() != null)
			return getRasgo().getNombre()
					+ ((this.getClase() != null) ? " - " + this.getClase() : "")
					+ " : " + numbertFormat.format(getValor());
		return "";
	}

	@Override
	public Object clone() {
		RasgoObjeto rasgo = new RasgoObjeto(this.getRasgo(), this.getValor(),
				this.getClase());
		return rasgo;
	}

}
